﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Transactions;
using SMA.GENTEv1.Dados;

namespace SMA.GENTEv1
{
    public class Pessoa
    {
        #region Variaveis Membro
        private int _idPessoa;	                            //	Id_pessoa	int
        private string _foto;	                            //	foto	nvarchar
        private string _nome;	                            //	nome_completo	varchar
        private string _apelido;	                        //	apelido	nvarchar
        private string _homepage;	                        //	homepage	varchar
        private string _nomePai;	                        //	pai	varchar
        private string _nomeMae;	                        //	mae	varchar
        private TipoSexo _sexo;	                                //	sexo	int
        private DateTime? _DataNascimento;	                //	dt_nascimento	smalldatetime
        private Cidade _cidadeNascimento;	                //	Id_cidade_nascimento	int
        private TipoRacaCor _tipoRacaCor;	                //	id_tipo_raca_cor	int
        private decimal? _altura;	                        //	altura	decimal
        private decimal? _peso;	                            //	peso	decimal
        private TipoCabelo _tipoCabelo;	                    //	id_tipo_cabelo	int
        private TipoOlho _tipoOlho;	                        //	id_tipo_olho	int
        private string _sinal;	                            //	sinal	varchar
        private TipoSanguineo _tipoSanguineo;	            //	id_tipo_sanguineo	int
        private string _possuiDeficiencia;	                //	possui_deficiencia	char
        private TipoDeficienteFisico _tipoDeficienteFisico;	//	id_tipo_deficiencia	int
        private EstadoCivil _estadoCivil;	                //	Id_estadocivil	int
        private string _imgEstadoCivil;	                    //	path_estado_civil	varchar
        private string _ficha;	                            //	ficha	varchar
        private GrauInstrucao _grauInstrucao;	            //	id_grauinstrucao	int
        private string _observacao;	                        //	quem_sou_eu_quero_da_vida	varchar
        private string _observacaoAdicional;	            //	comentario_adicional	varchar
        private double? _pi;	                                //	pi	float
        private string _condutor;	                        //	condutor	char
        private string _matricula;	                        //	matricula	varchar
        private TipoContratacao _tipoContratacao;	        //	Id_tipo_contratacao	int
        private DateTime? _dataAdmissao;	                    //	dt_admissao	smalldatetime
        private string _aptoAdmissao;	                    //	apto_admissao	nchar
        private DateTime? _dataDemissao;	                    //	dt_demissao	smalldatetime
        private string _aptoDemissao;	                    //	apto_demissao	nchar
        private StatusPessoa _statusPessoa;	                //	Id_status_pessoa	int
        private int _idOrganizacao;	                        //	id_organizacao	int
        //private Cargo _cargoAtual;	                    //	id_cargo_atual	int
        private string _motorista;	                        //	motorista	char
        //private	int	_adicionalMotorista	;	            //	adMotorista	int
        private JornadaTrabalho _jornadaTrabalho;	        //	id_jornada_trabalho	int
        //private double? _horaMes;	                            //	hora_mes	float
        //private decimal? _salario;	                        //	salario	money
        //private	int	_adicionalPericulosidade;	        //	ad_Periculosidade	int
        private string _opcaoFGTS;	                        //	opcao_FGTS	char
        private string _contaFGTS;	                        //	conta_FGTS	char
        private double? _cpf;	                                //	CPF	float
        //private string _seguroVida;	                    //	seguro_vida	char
        //private string autoriza_desconto_seg_vida;	    //	autoriza_desconto_seg_vida	char
        //private char e_gestor;	                        //	e_gestor	char
        //private char vale_transporte;	                    //	vale_transporte	char
        //private int id_sindicato;	                        //	id_sindicato	int
        private string _conjuge;
        private DateTime? _dataNascimentoConjuge;

        private List<PessoaTelefone> _telefones;
        private List<PessoaEndereco> _enderecos;
        private List<PessoaNacionalidade> _nacionalidade;

        private List<PessoaDocRG> _docRG;
        private List<PessoaDocReservista> _docReservista;
        private List<PessoaDocCTPS> _docCTPS;
        private List<PessoaDocCNH> _docCNH;
        private List<PessoaDocTituloEleitor> _docTituloEleitor;
        private List<PessoaDocPis> _docPis;

        private List<PessoaAtestado> _atestados;

        private GENTEEntities _context;
        
        //-----------------------------

        ////private int _idPessoa;
        ////private string _possuiDeficiencia;
        //private Organizacao _organizacao;
        ////private string _nomeCompleto;
        ////private string _matricula;
        /////private string _foto;
        //private System.DateTime? _dtAdmissao;
        ////private PessoaStatus _pessoaStatus;
        ////private TipoContratacao _tipoContratacao;
        ////private TipoDeficienteFisico _tipoDeficienteFisico;
        //private PessoaAtestado _pessoaAtestado;
        //private List<PessoaAdvertencia> _advertencia;
        //private List<PessoaDemissao> _pessoaDemissao;
        ////private double? _cpf = 0;
        //private List<PessoaCNH> _cnh;
        
        #endregion

        #region Parametros
        public int IdPessoa
        {
            get { return _idPessoa; }
            set { _idPessoa = value; }
        }
        public string Foto
        {
            get { return _foto; }
            set { _foto = value; }
        }
        public string Nome
        {
            get { return _nome; }
            set { _nome = value; }
        }
        public string Apelido
        {
            get { return _apelido; }
            set { _apelido = value; }
        }
        public string Homepage
        {
            get { return _homepage; }
            set { _homepage = value; }
        }
        public string NomePai
        {
            get { return _nomePai; }
            set { _nomePai = value; }
        }
        public string NomeMae
        {
            get { return _nomeMae; }
            set { _nomeMae = value; }
        }
        public TipoSexo Sexo
        {
            get { return _sexo; }
            set { _sexo = value; }
        }
        public DateTime? DataNascimento
        {
            get { return _DataNascimento; }
            set { _DataNascimento = value; }
        }
        public Cidade CidadeNascimento
        {
            get { return _cidadeNascimento; }
            set { _cidadeNascimento = value; }
        }
        public TipoRacaCor TipoRacaCor
        {
            get { return _tipoRacaCor; }
            set { _tipoRacaCor = value; }
        }
        public decimal? Altura
        {
            get { return _altura; }
            set { _altura = value; }
        }
        public decimal? Peso
        {
            get { return _peso; }
            set { _peso = value; }
        }
        public TipoCabelo TipoCabelo
        {
            get { return _tipoCabelo; }
            set { _tipoCabelo = value; }
        }
        public TipoOlho TipoOlho
        {
            get { return _tipoOlho; }
            set { _tipoOlho = value; }
        }
        public string Sinal
        {
            get { return _sinal; }
            set { _sinal = value; }
        }
        public TipoSanguineo TipoSanguineo
        {
            get { return _tipoSanguineo; }
            set { _tipoSanguineo = value; }
        }
        public string PossuiDeficiencia
        {
            get { return _possuiDeficiencia; }
            set { _possuiDeficiencia = value; }
        }
        public TipoDeficienteFisico TipoDeficienteFisico
        {
            get { return _tipoDeficienteFisico; }
            set { _tipoDeficienteFisico = value; }
        }
        public EstadoCivil EstadoCivil
        {
            get { return _estadoCivil; }
            set { _estadoCivil = value; }
        }
        public string ImgEstadoCivil
        {
            get { return _imgEstadoCivil; }
            set { _imgEstadoCivil = value; }
        }
        public string Ficha
        {
            get { return _ficha; }
            set { _ficha = value; }
        }
        public GrauInstrucao GrauInstrucao
        {
            get { return _grauInstrucao; }
            set { _grauInstrucao = value; }
        }
        public string Observacao
        {
            get { return _observacao; }
            set { _observacao = value; }
        }
        public string ObservacaoAdicional
        {
            get { return _observacaoAdicional; }
            set { _observacaoAdicional = value; }
        }
        public double? Pi
        {
            get { return _pi; }
            set { _pi = value; }
        }
        public string Condutor
        {
            get { return _condutor; }
            set { _condutor = value; }
        }
        public string Matricula
        {
            get { return _matricula; }
            set { _matricula = value; }
        }
        public TipoContratacao TipoContratacao
        {
            get { return _tipoContratacao; }
            set { _tipoContratacao = value; }
        }
        public DateTime? DataAdmissao
        {
            get { return _dataAdmissao; }
            set { _dataAdmissao = value; }
        }
        public string AptoAdmissao
        {
            get { return _aptoAdmissao; }
            set { _aptoAdmissao = value; }
        }
        public DateTime? DataDemissao
        {
            get { return _dataDemissao; }
            set { _dataDemissao = value; }
        }
        public string AptoDemissao
        {
            get { return _aptoDemissao; }
            set { _aptoDemissao = value; }
        }
        public StatusPessoa StatusPessoa
        {
            get { return _statusPessoa; }
            set { _statusPessoa = value; }
        }
        public int IdOrganizacao
        {
            get { return _idOrganizacao; }
            set { _idOrganizacao = value; }
        }
        //public Cargo CargoAtual
        //{
        //    get { return _cargoAtual; }
        //    set { _cargoAtual = value; }
        //}
        public string Motorista
        {
            get { return _motorista; }
            set { _motorista = value; }
        }
        public JornadaTrabalho JornadaTrabalho
        {
            get { return _jornadaTrabalho; }
            set { _jornadaTrabalho = value; }
        }
        //public double? HoraMes
        //{
        //    get { return _horaMes; }
        //    set { _horaMes = value; }
        //}
        //public decimal? Salario
        //{
        //    get { return _salario; }
        //    set { _salario = value; }
        //}
        public string OpcaoFGTS
        {
            get { return _opcaoFGTS; }
            set { _opcaoFGTS = value; }
        }
        public string ContaFGTS
        {
            get { return _contaFGTS; }
            set { _contaFGTS = value; }
        }
        public double? Cpf
        {
            get { return _cpf; }
            set { _cpf = value; }
        }
        public string Conjuge
        {
            get { return _conjuge; }
            set { _conjuge = value; }
        }
        public DateTime? DataNascimentoConjuge
        {
            get { return _dataNascimentoConjuge; }
            set { _dataNascimentoConjuge = value; }
        }
        public List<PessoaTelefone> Telefones
        {
            get { return _telefones; }
            set { _telefones = value; }
        }
        public List<PessoaEndereco> Enderecos
        {
            get { return _enderecos; }
            set { _enderecos = value; }
        }
        public List<PessoaNacionalidade> Nacionalidade
        {
            get { return _nacionalidade; }
            set { _nacionalidade = value; }
        }
        public List<PessoaDocRG> DocRG
        {
            get { return _docRG; }
            set { _docRG = value; }
        }
        public List<PessoaDocReservista> DocReservista
        {
            get { return _docReservista; }
            set { _docReservista = value; }
        }
        public List<PessoaDocCTPS> DocCTPS
        {
            get { return _docCTPS; }
            set { _docCTPS = value; }
        }
        public List<PessoaDocCNH> DocCNH
        {
            get { return _docCNH; }
            set { _docCNH = value; }
        }
        public List<PessoaDocTituloEleitor> DocTituloEleitor
        {
            get { return _docTituloEleitor; }
            set { _docTituloEleitor = value; }
        }
        public List<PessoaDocPis> DocPis
        {
            get { return _docPis; }
            set { _docPis = value; }
        }
        public List<PessoaAtestado> Atestados
        {
            get { return _atestados; }
            set { _atestados = value; }
        }
        #endregion

        #region Construtores
        public Pessoa()
        {
            _context = new GENTEEntities();
        }

        public Pessoa(int idPessoa)
        {
            _context = new GENTEEntities();
            Carregar(idPessoa);
        }
        public Pessoa(int idPessoa, bool isDadosBasicos)
        {
            _context = new GENTEEntities();
            if (isDadosBasicos)
                CarregarBasico(idPessoa);
            else
                Carregar(idPessoa);
        }
        #endregion

        #region Metodos Privados
        private void Carregar(int idPessoa)
        {
            try
            {
                var consulta = from pessoa in _context.tab_pessoa
                               where pessoa.Id_pessoa == idPessoa
                               select new
                               {
                                   pessoa.Id_pessoa,
                                   pessoa.foto,
                                   pessoa.nome_completo,
                                   pessoa.apelido,
                                   pessoa.homepage,
                                   pessoa.pai,
                                   pessoa.mae,
                                   pessoa.tab_sexo.id_sexo,
                                   pessoa.dt_nascimento,
                                   Id_cidade_nascimento = pessoa.tab_cidade.id_cidade,
                                   pessoa.tab_tipo_raca_cor.id_tipo_raca_cor,
                                   pessoa.altura,
                                   pessoa.peso,
                                   pessoa.tab_tipo_cabelo.id_tipo_cabelo,
                                   pessoa.tab_tipo_olho.id_tipo_olho,
                                   pessoa.sinal,
                                   pessoa.tab_tipo_sanguineo.id_tipo_sanguineo,
                                   pessoa.possui_deficiencia,
                                   pessoa.tab_tipo_deficiente_fisico.id_tipo_deficiencia,
                                   pessoa.tab_estado_civil.Id_estado_civil,
                                   pessoa.path_estado_civil,
                                   pessoa.ficha,
                                   pessoa.tab_grau_instrucao.Id_grauinstrucao,
                                   pessoa.quem_sou_eu_quero_da_vida,
                                   pessoa.comentario_adicional,
                                   pessoa.pi,
                                   pessoa.condutor,
                                   pessoa.matricula,
                                   pessoa.tab_tipo_contratacao.Id_tipo_contratacao,
                                   pessoa.dt_admissao,
                                   pessoa.apto_admissao,
                                   //pessoa.dt_demissao,
                                   //pessoa.apto_demissao,
                                   pessoa.tab_pessoa_status.id_status_pessoa,
                                   id_organizacao = pessoa.tab_organizacao.Id_organizacao,
                                   pessoa.motorista,
                                   pessoa.tab_jornada_trabalho.Id_jornada_trabalho,
                                   //pessoa.hora_mes,
                                   //pessoa.salario,
                                   pessoa.opcao_FGTS,
                                   pessoa.conta_FGTS,
                                   pessoa.CPF
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {

                    this.IdPessoa = list.Id_pessoa;
                    this.Foto = list.foto;
                    this.Nome = list.nome_completo;
                    this.Cpf = list.CPF;
                    this.Apelido = list.apelido;
                    this.Homepage = list.homepage;
                    this.NomePai = list.pai;
                    this.NomeMae = list.mae;
                    this.Sexo = new TipoSexo(list.id_sexo);
                    this.DataNascimento = list.dt_nascimento;
                    this.CidadeNascimento = new Cidade(list.Id_cidade_nascimento);
                    this.TipoRacaCor = new TipoRacaCor(list.id_tipo_raca_cor);
                    this.Altura = list.altura;
                    this.Peso = list.peso;
                    this.TipoCabelo = new TipoCabelo(list.id_tipo_cabelo);
                    this.TipoOlho = new TipoOlho(list.id_tipo_olho);
                    this.Sinal = list.sinal;
                    this.TipoSanguineo = new TipoSanguineo(list.id_tipo_sanguineo);
                    this.PossuiDeficiencia = list.possui_deficiencia;
                    this.TipoDeficienteFisico = new TipoDeficienteFisico(list.id_tipo_deficiencia);
                    this.EstadoCivil = new EstadoCivil(list.Id_estado_civil);
                    this.ImgEstadoCivil = list.path_estado_civil;
                    this.Ficha = list.ficha;
                    this.GrauInstrucao = new GrauInstrucao(list.Id_grauinstrucao);
                    this.Observacao = list.quem_sou_eu_quero_da_vida;
                    this.ObservacaoAdicional = list.comentario_adicional;
                    this.Pi = list.pi;
                    this.Condutor = list.condutor;
                    this.Matricula = list.matricula;
                    this.TipoContratacao = new TipoContratacao(list.Id_tipo_contratacao);
                    this.DataAdmissao = list.dt_admissao;
                    this.AptoAdmissao = list.apto_admissao;
                    //this.DataDemissao = list.dt_demissao;
                    //this.AptoDemissao = list.apto_demissao;
                    this.StatusPessoa = new StatusPessoa(list.id_status_pessoa);
                    this.IdOrganizacao = list.id_organizacao;
                    this.Motorista = list.motorista;
                    this.JornadaTrabalho = new JornadaTrabalho(list.Id_jornada_trabalho);
                    //this.HoraMes = list.hora_mes;
                    //this.Salario = list.salario;
                    this.OpcaoFGTS = list.opcao_FGTS;
                    this.ContaFGTS = list.conta_FGTS;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        private void CarregarBasico(int idPessoa)
        {
            try
            {
                var consulta = from pessoa in _context.tab_pessoa
                               where pessoa.Id_pessoa == idPessoa
                               select new
                               {
                                   pessoa.Id_pessoa,
                                   pessoa.foto,
                                   pessoa.nome_completo,
                                   pessoa.apelido,
                                   pessoa.CPF
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {

                    this.IdPessoa = list.Id_pessoa;
                    this.Foto = list.foto;
                    this.Nome = list.nome_completo;                    
                    this.Apelido = list.apelido;
                    this.Cpf = list.CPF;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        private int[] ObterCodigosSelecao(List<StatusPessoa> pPessoaStatus)
        {
            int[] _codigos = new int[pPessoaStatus.Count];
            int _cont = 0;

            foreach (StatusPessoa item in pPessoaStatus)
            {
                _codigos[_cont] = item.IdStatusPessoa;
                _cont++;
            }

            return _codigos;
        }

        private static Expression<Func<TElement, bool>> BuildContainsExpression<TElement, TValue>(Expression<Func<TElement, TValue>> valueSelector, IEnumerable<TValue> values)
        {
            if (null == valueSelector)
            {
                throw new
                    ArgumentNullException("valueSelector");
            }
            if (null == values) { throw new ArgumentNullException("values"); }

            ParameterExpression p = valueSelector.Parameters.Single();
            if (!values.Any())
            {
                return e => false;
            }

            var equals = values.Select(value =>
            (Expression)Expression.Equal(valueSelector.Body, Expression.Constant(value,
            typeof(TValue))));
            var body = equals.Aggregate<Expression>((accumulate, equal) =>
            Expression.Or(accumulate, equal));
            return Expression.Lambda<Func<TElement, bool>>(body, p);
        }
        
        /*
        public int RetornaIdPessoa(int pIdOrganizacao, string pMatricula)
        {
            try
            {
                int idPessoa = 0;

                var consulta = from pessoa in _context.tab_pessoa
                               where pessoa.tab_organizacao.Id_organizacao == pIdOrganizacao
                               && pessoa.matricula == pMatricula
                               select new
                               {
                                   pessoa.Id_pessoa
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    idPessoa = list.Id_pessoa;
                    break;
                }

                return idPessoa;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        

        private void Carregar(int pIdPessoa)
        {
            try
            {
                var consulta = (from pessoa in _context.tab_pessoa
                                where (pessoa.Id_pessoa == pIdPessoa)
                                select new
                                {
                                    pessoa.Id_pessoa,
                                    pessoa.dt_admissao,
                                    pessoa.matricula,
                                    pessoa.nome_completo,
                                    pessoa.tab_organizacao.Id_organizacao,
                                    pessoa.tab_pessoa_status.id_status_pessoa,
                                    pessoa.possui_deficiencia,
                                    idTipoDeficiencia = (pessoa.tab_tipo_deficiente_fisico.id_tipo_deficiencia == null) ? 0 : pessoa.tab_tipo_deficiente_fisico.id_tipo_deficiencia,
                                    pessoa.tab_tipo_contratacao.Id_tipo_contratacao,
                                    pessoa.CPF,
                                    pessoa.foto
                                });

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    this._idPessoa = list.Id_pessoa;
                    this._nomeCompleto = list.nome_completo;
                    this._dtAdmissao = list.dt_admissao;
                    this._matricula = list.matricula;
                    this._possuiDeficiencia = list.possui_deficiencia;
                    this._tipoDeficienteFisico = new TipoDeficienteFisico(list.idTipoDeficiencia);
                    this._organizacao = new Organizacao(list.Id_organizacao);
                    this._pessoaStatus = new PessoaStatus(list.id_status_pessoa);
                    this._tipoContratacao = new TipoContratacao(list.Id_tipo_contratacao);
                    this._cpf = list.CPF;
                    this._foto = list.foto;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        */
        #endregion

        #region Metodos Publicos

        #region Metodos de Selecao - Classe
        public void CarregarDadosPessoais()
        {
            try
            {
                var consulta = from pessoa in _context.tab_pessoa
                               where pessoa.Id_pessoa == this.IdPessoa
                               select new
                               {
                                   pessoa.nome_completo,
                                   pessoa.apelido,
                                   id_sexo = pessoa.tab_sexo == null ? 0 : pessoa.tab_sexo.id_sexo,
                                   Id_estado_civil = pessoa.tab_estado_civil == null ? 0 : pessoa.tab_estado_civil.Id_estado_civil,
                                   pessoa.dt_nascimento
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    this.Nome = list.nome_completo;
                    this.Apelido = list.apelido;
                    if (list.id_sexo != 0)
                        this.Sexo = new TipoSexo(list.id_sexo);
                    if (list.Id_estado_civil != 0)
                        this.EstadoCivil = new EstadoCivil(list.Id_estado_civil);
                    this.DataNascimento = list.dt_nascimento;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public void CarregarNaturalidade()
        {
            try
            {
                var consulta = from pessoa in _context.tab_pessoa
                               where pessoa.Id_pessoa == this.IdPessoa
                               select new
                               {
                                   cidadeNaturalidade = pessoa.tab_cidade == null ? 0 : pessoa.tab_cidade.id_cidade
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    if (list.cidadeNaturalidade != 0)
                        this.CidadeNascimento = new Cidade(list.cidadeNaturalidade);
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public void CarregarFiliacao()
        {
            try
            {
                var consulta = from pessoa in _context.tab_pessoa
                               where pessoa.Id_pessoa == this.IdPessoa
                               select new
                               {
                                   pessoa.mae,
                                   pessoa.pai
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    this.NomeMae = list.mae;
                    this.NomePai = list.pai;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public void CarregarConjuge()
        {
            try
            {
                var consulta = from pessoa in _context.tab_pessoa
                               where pessoa.Id_pessoa == this.IdPessoa
                               select new
                               {
                                   pessoa.conjuge,
                                   pessoa.dt_nascimento_conjuge
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    this.Conjuge = list.conjuge;
                    this.DataNascimentoConjuge = list.dt_nascimento_conjuge;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public void CarregarCaracteristicasFisicas()
        {
            try
            {
                var consulta = from pessoa in _context.tab_pessoa
                               where pessoa.Id_pessoa == this.IdPessoa
                               select new
                               {
                                   id_tipo_raca_cor = pessoa.tab_tipo_raca_cor == null ? 0 : pessoa.tab_tipo_raca_cor.id_tipo_raca_cor,
                                   pessoa.peso,
                                   pessoa.altura,
                                   id_tipo_cabelo = pessoa.tab_tipo_cabelo == null ? 0 : pessoa.tab_tipo_cabelo.id_tipo_cabelo,
                                   id_tipo_olho = pessoa.tab_tipo_olho == null ? 0 : pessoa.tab_tipo_olho.id_tipo_olho,
                                   pessoa.sinal,
                                   id_tipo_sanguineo = pessoa.tab_tipo_sanguineo == null ? 0 : pessoa.tab_tipo_sanguineo.id_tipo_sanguineo
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    if (list.id_tipo_raca_cor != 0)
                        this.TipoRacaCor = new TipoRacaCor(list.id_tipo_raca_cor);
                    this.Peso = list.peso;
                    this.Altura = list.altura;
                    if (list.id_tipo_cabelo != 0)
                        this.TipoCabelo = new TipoCabelo(list.id_tipo_cabelo);
                    if (list.id_tipo_olho != 0)
                        this.TipoOlho = new TipoOlho(list.id_tipo_olho);
                    this.Sinal = list.sinal;
                    if (list.id_tipo_sanguineo != 0)
                        this.TipoSanguineo = new TipoSanguineo(list.id_tipo_sanguineo);
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public void CarregarObservacoes()
        {
            try
            {
                var consulta = from pessoa in _context.tab_pessoa
                               where pessoa.Id_pessoa == this.IdPessoa
                               select new
                               {
                                   pessoa.quem_sou_eu_quero_da_vida,
                                   pessoa.comentario_adicional
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    this.Observacao = list.quem_sou_eu_quero_da_vida;
                    this.ObservacaoAdicional = list.comentario_adicional;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public void CarregarNacionalidade()
        {
            try
            {
                PessoaNacionalidade pessoaNacionalidade = new PessoaNacionalidade();
                this.Nacionalidade = pessoaNacionalidade.SelectPorPessoa(this.IdPessoa);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region Metodos de Selecao - Coleção
        public List<Pessoa> SelectAll()
        {
            try
            {
                List<Pessoa> listPessoa = new List<Pessoa>();

                var consulta = from pessoa in _context.tab_pessoa
                               select new
                               {
                                   pessoa.Id_pessoa,
                                   pessoa.foto,
                                   pessoa.nome_completo,
                                   pessoa.apelido,
                                   pessoa.homepage,
                                   pessoa.pai,
                                   pessoa.mae,
                                   pessoa.tab_sexo.id_sexo,
                                   pessoa.dt_nascimento,
                                   Id_cidade_nascimento = pessoa.tab_cidade.id_cidade,
                                   pessoa.tab_tipo_raca_cor.id_tipo_raca_cor,
                                   pessoa.altura,
                                   pessoa.peso,
                                   pessoa.tab_tipo_cabelo.id_tipo_cabelo,
                                   pessoa.tab_tipo_olho.id_tipo_olho,
                                   pessoa.sinal,
                                   pessoa.tab_tipo_sanguineo.id_tipo_sanguineo,
                                   pessoa.possui_deficiencia,
                                   pessoa.tab_tipo_deficiente_fisico.id_tipo_deficiencia,
                                   pessoa.tab_estado_civil.Id_estado_civil,
                                   pessoa.path_estado_civil,
                                   pessoa.ficha,
                                   pessoa.tab_grau_instrucao.Id_grauinstrucao,
                                   pessoa.quem_sou_eu_quero_da_vida,
                                   pessoa.comentario_adicional,
                                   pessoa.pi,
                                   pessoa.condutor,
                                   pessoa.matricula,
                                   pessoa.tab_tipo_contratacao.Id_tipo_contratacao,
                                   pessoa.dt_admissao,
                                   pessoa.apto_admissao,
                                   //pessoa.dt_demissao,
                                   //pessoa.apto_demissao,
                                   pessoa.tab_pessoa_status.id_status_pessoa,
                                   id_organizacao = pessoa.tab_organizacao.Id_organizacao,
                                   pessoa.motorista,
                                   pessoa.tab_jornada_trabalho.Id_jornada_trabalho,
                                   //pessoa.hora_mes,
                                   //pessoa.salario,
                                   pessoa.opcao_FGTS,
                                   pessoa.conta_FGTS,
                                   pessoa.CPF
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    Pessoa pessoa = new Pessoa();
                    pessoa.IdPessoa = list.Id_pessoa;
                    pessoa.Foto = list.foto;
                    pessoa.Nome = list.nome_completo;
                    pessoa.Apelido = list.apelido;
                    pessoa.Homepage = list.homepage;
                    pessoa.NomePai = list.pai;
                    pessoa.NomeMae = list.mae;
                    pessoa.Sexo = new TipoSexo(list.id_sexo);
                    pessoa.DataNascimento = list.dt_nascimento;
                    pessoa.CidadeNascimento = new Cidade(list.Id_cidade_nascimento);
                    pessoa.TipoRacaCor = new TipoRacaCor(list.id_tipo_raca_cor);
                    pessoa.Altura = list.altura;
                    pessoa.Peso = list.peso;
                    pessoa.TipoCabelo = new TipoCabelo(list.id_tipo_cabelo);
                    pessoa.TipoOlho = new TipoOlho(list.id_tipo_olho);
                    pessoa.Sinal = list.sinal;
                    pessoa.TipoSanguineo = new TipoSanguineo(list.id_tipo_sanguineo);
                    pessoa.PossuiDeficiencia = list.possui_deficiencia;
                    pessoa.TipoDeficienteFisico = new TipoDeficienteFisico(list.id_tipo_deficiencia);
                    pessoa.EstadoCivil = new EstadoCivil(list.Id_estado_civil);
                    pessoa.ImgEstadoCivil = list.path_estado_civil;
                    pessoa.Ficha = list.ficha;
                    pessoa.GrauInstrucao = new GrauInstrucao(list.Id_grauinstrucao);
                    pessoa.Observacao = list.quem_sou_eu_quero_da_vida;
                    pessoa.ObservacaoAdicional = list.comentario_adicional;
                    pessoa.Pi = list.pi;
                    pessoa.Condutor = list.condutor;
                    pessoa.Matricula = list.matricula;
                    pessoa.TipoContratacao = new TipoContratacao(list.Id_tipo_contratacao);
                    pessoa.DataAdmissao = list.dt_admissao;
                    pessoa.AptoAdmissao = list.apto_admissao;
                    //pessoa.DataDemissao = list.dt_demissao;
                    //pessoa.AptoDemissao = list.apto_demissao;
                    pessoa.StatusPessoa = new StatusPessoa(list.id_status_pessoa);
                    pessoa.IdOrganizacao = list.id_organizacao;
                    pessoa.Motorista = list.motorista;
                    pessoa.JornadaTrabalho = new JornadaTrabalho(list.Id_jornada_trabalho);
                    //pessoa.HoraMes = list.hora_mes;
                    //pessoa.Salario = list.salario;
                    pessoa.OpcaoFGTS = list.opcao_FGTS;
                    pessoa.ContaFGTS = list.conta_FGTS;
                    pessoa.Cpf = list.CPF;

                    listPessoa.Add(pessoa);
                }

                return listPessoa;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public List<Pessoa> SelectPessoaPesquisa(string nome)
        {
            try
            {
                List<Pessoa> listPessoaDeficiencia = new List<Pessoa>();

                var consulta = from pessoa in _context.tab_pessoa
                               where ((nome != "") ? pessoa.nome_completo.StartsWith(nome) : 1 == 1)
                               orderby pessoa.nome_completo
                               select new
                               {
                                   pessoa.Id_pessoa,
                                   pessoa.nome_completo,
                                   pessoa.matricula,
                                   pessoa.foto,
                                   pessoa.CPF
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    Pessoa pessoa = new Pessoa();
                    pessoa.IdPessoa = list.Id_pessoa;
                    pessoa.Nome = list.nome_completo;
                    pessoa.Matricula = list.matricula;
                    pessoa.Cpf = list.CPF;
                    pessoa.Foto = list.foto;

                    listPessoaDeficiencia.Add(pessoa);
                }

                return listPessoaDeficiencia;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public List<Pessoa> SelectPessoaPesquisa(string nome, int idPrestador)
        {
            try
            {
                List<Pessoa> listPessoaDeficiencia = new List<Pessoa>();

                var consulta = from pessoa in _context.tab_pessoa
                               where ((nome != "") ? pessoa.nome_completo.StartsWith(nome) : 1 == 1)
                               && pessoa.tab_organizacao.Id_organizacao == idPrestador
                               orderby pessoa.nome_completo
                               select new
                               {
                                   pessoa.Id_pessoa,
                                   pessoa.nome_completo,
                                   pessoa.matricula,
                                   pessoa.foto,
                                   pessoa.CPF
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    Pessoa pessoa = new Pessoa();
                    pessoa.IdPessoa = list.Id_pessoa;
                    pessoa.Nome = list.nome_completo;
                    pessoa.Matricula = list.matricula;
                    pessoa.Cpf = list.CPF;
                    pessoa.Foto = list.foto;

                    listPessoaDeficiencia.Add(pessoa);
                }

                return listPessoaDeficiencia;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public string RetornaFoto(int idPessoa)
        {
            try
            {
                string foto = string.Empty;

                var consulta = from pessoa in _context.tab_pessoa
                               where pessoa.Id_pessoa == idPessoa
                               select new
                               {
                                   pessoa.Id_pessoa,
                                   pessoa.foto,
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    foto = list.foto;
                    break;
                }

                return foto;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public List<Pessoa> SelecionarDeficienteFisico(int pIdContrato, List<StatusPessoa> pPessoaStatus)
        {
            List<Pessoa> listPessoaDeficiencia = new List<Pessoa>();

            try
            {
                int[] _codStatusSelecao = ObterCodigosSelecao(pPessoaStatus);

                var consulta = from pessoa in (_codStatusSelecao[0] != 0) ? _context.tab_pessoa.Where((BuildContainsExpression<tab_pessoa, int>(item => item.tab_pessoa_status.id_status_pessoa, _codStatusSelecao))) : _context.tab_pessoa
                               join contratopessoa in _context.tab_contrato_pessoa on pessoa.Id_pessoa equals contratopessoa.tab_pessoa.Id_pessoa
                               where (pessoa.possui_deficiencia == "S")
                               && (pessoa.tab_tipo_contratacao.c_def_fisico == "X")
                               && (pessoa.tab_pessoa_status.id_status_pessoa != 2)
                               && (contratopessoa.tab_contrato.Id_contrato == pIdContrato)
                               select new
                               {
                                   pessoa.Id_pessoa,
                                   pessoa.nome_completo,
                                   pessoa.matricula,
                                   pessoa.dt_admissao,
                                   pessoa.tab_tipo_deficiente_fisico.id_tipo_deficiencia,
                                   pessoa.tab_pessoa_status.id_status_pessoa,
                                   pessoa.tab_tipo_contratacao.Id_tipo_contratacao,
                                   pessoa.tab_organizacao.Id_organizacao,
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    Pessoa pessoa = new Pessoa();
                    pessoa.IdPessoa = list.Id_pessoa;
                    pessoa.Nome = list.nome_completo;
                    pessoa.Matricula = list.matricula;
                    pessoa.DataAdmissao = list.dt_admissao;
                    pessoa.StatusPessoa = new StatusPessoa(list.id_status_pessoa);
                    pessoa.TipoDeficienteFisico = new TipoDeficienteFisico(list.id_tipo_deficiencia);
                    pessoa.TipoContratacao = new TipoContratacao(list.Id_tipo_contratacao);

                    listPessoaDeficiencia.Add(pessoa);
                }

                return listPessoaDeficiencia;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public bool ExisteCPF(double cpf, int idPrestador)
        {
            try
            {
                bool existe = false;

                var consulta = from pessoa in _context.tab_pessoa
                               where pessoa.CPF == cpf
                               && pessoa.tab_organizacao.Id_organizacao == idPrestador
                               select new
                               {
                                   pessoa.Id_pessoa,
                                   pessoa.CPF,
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    existe = true;
                    break;
                }

                return existe;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        /*
        

        public List<Pessoa> SelecionarDeficienteFisico(int pIdContrato, int[] pPessoaStatus)
        {
            List<Pessoa> listPessoaDeficiencia = new List<Pessoa>();

            try
            {
                var consulta = from pessoa in (pPessoaStatus[0] != 0) ? _context.tab_pessoa.Where((BuildContainsExpression<tab_pessoa, int>(item => item.tab_pessoa_status.id_status_pessoa, pPessoaStatus))) : _context.tab_pessoa
                               join contratopessoa in _context.tab_contrato_pessoa on pessoa.Id_pessoa equals contratopessoa.tab_pessoa.Id_pessoa
                               where (pessoa.possui_deficiencia == "S")
                               && (pessoa.tab_tipo_contratacao.c_def_fisico == "X")
                               && (pessoa.tab_pessoa_status.id_status_pessoa != 2)
                               && (contratopessoa.tab_contrato.Id_contrato == pIdContrato)
                               select new
                               {
                                   pessoa.Id_pessoa,
                                   pessoa.nome_completo,
                                   pessoa.matricula,
                                   pessoa.dt_admissao,
                                   pessoa.tab_tipo_deficiente_fisico.id_tipo_deficiencia,
                                   pessoa.tab_pessoa_status.id_status_pessoa,
                                   pessoa.tab_tipo_contratacao.Id_tipo_contratacao,
                                   pessoa.tab_organizacao.Id_organizacao,
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    Pessoa pessoa = new Pessoa();
                    pessoa.IdPessoa = list.Id_pessoa;
                    pessoa.NomeCompleto=list.nome_completo;
                    pessoa.Matricula=list.matricula;
                    pessoa.DtAdmissao=list.dt_admissao;
                    pessoa.PessoaStatus = new PessoaStatus(list.id_status_pessoa);
                    pessoa.TipoDeficienteFisico = new TipoDeficienteFisico(list.id_tipo_deficiencia);
                    pessoa.TipoContratacao = new TipoContratacao(list.Id_tipo_contratacao);
                    pessoa.Organizacao = new Organizacao(list.Id_organizacao);

                    listPessoaDeficiencia.Add(pessoa);
                }

                return listPessoaDeficiencia;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public List<Pessoa> SelecionarDeficienteFisico(int pIdContrato)
        {
            try
            {
                List<Pessoa> listPessoaDeficiencia = new List<Pessoa>();

                var consulta = from contrato in _context.tab_contrato
                               join contratopessoa in _context.tab_contrato_pessoa on contrato.Id_contrato equals contratopessoa.tab_contrato.Id_contrato
                               join pessoa in _context.tab_pessoa on contratopessoa.tab_pessoa.Id_pessoa equals pessoa.Id_pessoa
                               join tipocontratacao in _context.tab_tipo_contratacao on pessoa.tab_tipo_contratacao.Id_tipo_contratacao equals tipocontratacao.Id_tipo_contratacao
                               where pessoa.possui_deficiencia == "S"
                               && pessoa.tab_pessoa_status.id_status_pessoa != 2
                               && contrato.Id_contrato == pIdContrato
                               && tipocontratacao.c_def_fisico == "S"
                               select new
                               {
                                   pessoa.Id_pessoa,
                                   pessoa.nome_completo,
                                   pessoa.matricula,
                                   pessoa.dt_admissao,
                                   pessoa.tab_tipo_deficiente_fisico.id_tipo_deficiencia,
                                   pessoa.tab_pessoa_status.id_status_pessoa,
                                   pessoa.tab_tipo_contratacao.Id_tipo_contratacao,
                                   pessoa.tab_organizacao.Id_organizacao,
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    Pessoa pessoa = new Pessoa();
                    pessoa.IdPessoa = list.Id_pessoa;
                    pessoa.NomeCompleto = list.nome_completo;
                    pessoa.Matricula = list.matricula;
                    pessoa.DtAdmissao = list.dt_admissao;
                    pessoa.PessoaStatus = new PessoaStatus(list.id_status_pessoa);
                    pessoa.TipoDeficienteFisico = new TipoDeficienteFisico(list.id_tipo_deficiencia);
                    pessoa.TipoContratacao = new TipoContratacao(list.Id_tipo_contratacao);
                    pessoa.Organizacao = new Organizacao(list.Id_organizacao);

                    listPessoaDeficiencia.Add(pessoa);
                }

                return listPessoaDeficiencia;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public List<Pessoa> SelectPessoa(string nome)
        {
            try
            {
                List<Pessoa> listPessoaDeficiencia = new List<Pessoa>();

                var consulta = from pessoa in _context.tab_pessoa
                               where ((nome != "") ? pessoa.nome_completo.Contains(nome) : 1 == 1)
                               orderby pessoa.nome_completo
                               select new
                               {
                                   pessoa.Id_pessoa,
                                   pessoa.nome_completo,
                                   pessoa.matricula,
                                   pessoa.foto
                                   //pessoa.dt_admissao,
                                   //pessoa.tab_tipo_deficiente_fisico.id_tipo_deficiencia,
                                   //pessoa.tab_pessoa_status.id_status_pessoa,
                                   //pessoa.tab_tipo_contratacao.Id_tipo_contratacao,
                                   //pessoa.tab_organizacao.Id_organizacao,
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    Pessoa pessoa = new Pessoa();
                    pessoa.IdPessoa = list.Id_pessoa;
                    pessoa.NomeCompleto = list.nome_completo;
                    pessoa.Matricula = list.matricula;
                    pessoa.Foto = list.foto;
                    //pessoa.DtAdmissao = list.dt_admissao;
                    //pessoa.PessoaStatus = new PessoaStatus(list.id_status_pessoa);
                    //pessoa.TipoDeficienteFisico = new TipoDeficienteFisico(list.id_tipo_deficiencia);
                    //pessoa.TipoContratacao = new TipoContratacao(list.Id_tipo_contratacao);
                    //pessoa.Organizacao = new Organizacao(list.Id_organizacao);

                    listPessoaDeficiencia.Add(pessoa);
                }

                return listPessoaDeficiencia;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        

        public List<Pessoa> SelectPessoa(int _organizacao, bool _carregaOrganizacao, bool _carregaStatus, 
                                         bool _carregaTipoContratacao, bool _carregaTipoDeficiencia, bool _carregaAdvertencias)
        {
            try
            {
                List<Pessoa> listPessoa = new List<Pessoa>();

                var consulta = (from pessoa in _context.tab_pessoa
                                where pessoa.tab_organizacao.Id_organizacao == _organizacao
                                select new
                                {
                                    pessoa.Id_pessoa,
                                    pessoa.nome_completo,
                                    pessoa.matricula,
                                    pessoa.dt_admissao,
                                    pessoa.tab_organizacao.Id_organizacao,
                                    id_status_pessoa = (pessoa.tab_pessoa_status.id_status_pessoa == null) ? 0 : pessoa.tab_pessoa_status.id_status_pessoa,
                                    pessoa.possui_deficiencia,
                                    Id_tipo_contratacao = (pessoa.tab_tipo_contratacao.Id_tipo_contratacao == null) ? 0 : pessoa.tab_tipo_contratacao.Id_tipo_contratacao,
                                    id_tipo_deficiencia = (pessoa.tab_tipo_deficiente_fisico.id_tipo_deficiencia == null) ? 0 : pessoa.tab_tipo_deficiente_fisico.id_tipo_deficiencia
                                });

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    Pessoa pessoa = new Pessoa();
                    pessoa.IdPessoa = list.Id_pessoa;
                    pessoa.NomeCompleto = list.nome_completo;
                    pessoa.Matricula = list.matricula;
                    pessoa.DtAdmissao = list.dt_admissao;

                    if (_carregaOrganizacao)
                        pessoa.Organizacao = new Organizacao(list.Id_organizacao, false, false);
                    else
                    {
                        pessoa.Organizacao = new Organizacao();
                        pessoa.Organizacao.IdOrganizacao = list.Id_organizacao;
                    }

                    if (_carregaStatus)
                        pessoa.PessoaStatus = new PessoaStatus(list.id_status_pessoa);
                    else
                    {
                        pessoa.PessoaStatus = new PessoaStatus();
                        pessoa.PessoaStatus.IdStatusPessoa = list.id_status_pessoa;
                    }

                    pessoa.PossuiDeficiencia = list.possui_deficiencia;

                    if (_carregaTipoContratacao)
                        pessoa.TipoContratacao = new TipoContratacao(list.Id_tipo_contratacao);
                    else
                    {
                        pessoa.TipoContratacao = new TipoContratacao();
                        pessoa.TipoContratacao.IdTipoContratacao = list.Id_tipo_contratacao;
                    }

                    if (_carregaTipoDeficiencia)
                        pessoa.TipoDeficienteFisico = new TipoDeficienteFisico(list.id_tipo_deficiencia);
                    else
                    {
                        pessoa.TipoDeficienteFisico = new TipoDeficienteFisico();
                        pessoa.TipoDeficienteFisico.IdTipoDeficiencia = list.id_tipo_deficiencia;
                    }

                    if (_carregaAdvertencias)
                    {
                        PessoaAdvertencia advertencia = new PessoaAdvertencia();
                        pessoa.Advertencia = advertencia.SelectAdvertencias(list.Id_pessoa, false, false, false);
                    }

                    listPessoa.Add(pessoa);
                }

                return listPessoa;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public List<Pessoa> SelectPessoa(string _nome, int _idorganizacao, bool _carregaStatus, bool _carregaTipoContratacao, 
                                         bool _carregaTipoDeficiencia, bool _carregaAdvertencias)
        {
            try
            {
                List<Pessoa> listPessoa = new List<Pessoa>();

                var consulta = from pessoa in _context.tab_pessoa
                               where pessoa.tab_organizacao.Id_organizacao == _idorganizacao
                               && ((_nome != "") ? pessoa.nome_completo.StartsWith(_nome) : 1 == 1)
                               select new
                               {
                                   pessoa.Id_pessoa,
                                   pessoa.nome_completo,
                                   pessoa.matricula,
                                   pessoa.dt_admissao,
                                   pessoa.tab_organizacao.Id_organizacao,
                                   id_status_pessoa = (pessoa.tab_pessoa_status.id_status_pessoa == null) ? 0 : pessoa.tab_pessoa_status.id_status_pessoa,
                                   pessoa.possui_deficiencia,
                                   Id_tipo_contratacao = (pessoa.tab_tipo_contratacao.Id_tipo_contratacao == null) ? 0 : pessoa.tab_tipo_contratacao.Id_tipo_contratacao,
                                   id_tipo_deficiencia = (pessoa.tab_tipo_deficiente_fisico.id_tipo_deficiencia == null) ? 0 : pessoa.tab_tipo_deficiente_fisico.id_tipo_deficiencia
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    Pessoa pessoa = new Pessoa();
                    pessoa.IdPessoa = list.Id_pessoa;
                    pessoa.Nome = list.nome_completo;
                    pessoa.Matricula = list.matricula;
                    pessoa.DtAdmissao = list.dt_admissao;

                    if (_carregaStatus)
                        pessoa.PessoaStatus = new PessoaStatus(list.id_status_pessoa);
                    else
                    {
                        pessoa.PessoaStatus = new PessoaStatus();
                        pessoa.PessoaStatus.IdStatusPessoa = list.id_status_pessoa;
                    }

                    pessoa.PossuiDeficiencia = list.possui_deficiencia;

                    if (_carregaTipoContratacao)
                        pessoa.TipoContratacao = new TipoContratacao(list.Id_tipo_contratacao);
                    else
                    {
                        pessoa.TipoContratacao = new TipoContratacao();
                        pessoa.TipoContratacao.IdTipoContratacao = list.Id_tipo_contratacao;
                    }

                    if (_carregaTipoDeficiencia)
                        pessoa.TipoDeficienteFisico = new TipoDeficienteFisico(list.id_tipo_deficiencia);
                    else
                    {
                        pessoa.TipoDeficienteFisico = new TipoDeficienteFisico();
                        pessoa.TipoDeficienteFisico.IdTipoDeficiencia = list.id_tipo_deficiencia;
                    }

                    if (_carregaAdvertencias)
                    {
                        PessoaAdvertencia advertencia = new PessoaAdvertencia();
                        pessoa.Advertencia = advertencia.SelectAdvertencias(list.Id_pessoa, false, false, false);
                    }

                    listPessoa.Add(pessoa);
                }

                return listPessoa;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        */
        #endregion

        #region Metodos de Persistencia
        public void SalvarDadosPessoais()
        {
            try
            {
                if (this.IdPessoa == 0)
                {
                    tab_pessoa tabPessoa = new tab_pessoa();

                    tabPessoa.nome_completo = this.Nome;
                    tabPessoa.apelido = this.Apelido;
                    tabPessoa.tab_sexoReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_sexo", "id_sexo", this.Sexo.IdTipoSexo);
                    tabPessoa.tab_estado_civilReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_estado_civil", "Id_estado_civil", this.EstadoCivil.IdEstadoCivil);
                    tabPessoa.dt_nascimento = this.DataNascimento;

                    _context.AddTotab_pessoa(tabPessoa);
                    _context.SaveChanges();
                }
                else
                {
                    tab_pessoa tabPessoa = (from pessoa in _context.tab_pessoa
                                                where pessoa.Id_pessoa == this.IdPessoa
                                                select pessoa).First();

                    tabPessoa.nome_completo = this.Nome;
                    tabPessoa.apelido = this.Apelido;
                    tabPessoa.tab_sexoReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_sexo", "id_sexo", this.Sexo.IdTipoSexo);
                    tabPessoa.tab_estado_civilReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_estado_civil", "Id_estado_civil", this.EstadoCivil.IdEstadoCivil);
                    tabPessoa.dt_nascimento = this.DataNascimento;

                    _context.SaveChanges();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public void SalvarNaturalidade()
        {
            try
            {
                if (this.IdPessoa == 0)
                {
                    tab_pessoa tabPessoa = new tab_pessoa();

                    tabPessoa.tab_cidadeReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_cidade", "id_cidade", this.CidadeNascimento.IdCidade);

                    _context.AddTotab_pessoa(tabPessoa);
                    _context.SaveChanges();
                }
                else
                {
                    tab_pessoa tabPessoa = (from pessoa in _context.tab_pessoa
                                                where pessoa.Id_pessoa == this.IdPessoa
                                                select pessoa).First();

                    tabPessoa.tab_cidadeReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_cidade", "id_cidade", this.CidadeNascimento.IdCidade);

                    _context.SaveChanges();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public void SalvarFiliacao()
        {
            try
            {
                if (this.IdPessoa == 0)
                {
                    tab_pessoa tabPessoa = new tab_pessoa();

                    tabPessoa.pai = this.NomePai;
                    tabPessoa.mae = this.NomeMae;

                    _context.AddTotab_pessoa(tabPessoa);
                    _context.SaveChanges();
                }
                else
                {
                    tab_pessoa tabPessoa = (from pessoa in _context.tab_pessoa
                                                where pessoa.Id_pessoa == this.IdPessoa
                                                select pessoa).First();

                    tabPessoa.pai = this.NomePai;
                    tabPessoa.mae = this.NomeMae;

                    _context.SaveChanges();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public void SalvarConjuge()
        {
            try
            {
                if (this.IdPessoa == 0)
                {
                    tab_pessoa tabPessoa = new tab_pessoa();

                    tabPessoa.conjuge = this.Conjuge;
                    tabPessoa.dt_nascimento_conjuge = this.DataNascimentoConjuge;

                    _context.AddTotab_pessoa(tabPessoa);
                    _context.SaveChanges();
                }
                else
                {
                    tab_pessoa tabPessoa = (from pessoa in _context.tab_pessoa
                                                where pessoa.Id_pessoa == this.IdPessoa
                                                select pessoa).First();

                    tabPessoa.conjuge = this.Conjuge;
                    tabPessoa.dt_nascimento_conjuge = this.DataNascimentoConjuge;

                    _context.SaveChanges();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public void SalvarCaractFisicas()
        {
            try
            {
                if (this.IdPessoa == 0)
                {
                    tab_pessoa tabPessoa = new tab_pessoa();

                    if (this.TipoRacaCor.IdTipoRacaCor != 0)
                        tabPessoa.tab_tipo_raca_corReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_tipo_raca_cor", "id_tipo_raca_cor", this.TipoRacaCor.IdTipoRacaCor);
                    tabPessoa.altura = this.Altura;
                    tabPessoa.peso = this.Peso;
                    if (this.TipoCabelo.IdTipoCabelo != 0)
                        tabPessoa.tab_tipo_cabeloReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_tipo_cabelo", "id_tipo_cabelo", this.TipoCabelo.IdTipoCabelo);
                    if (this.TipoOlho.IdTipoOlho != 0)
                        tabPessoa.tab_tipo_olhoReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_tipo_olho", "id_tipo_olho", this.TipoOlho.IdTipoOlho);
                    tabPessoa.sinal = this.Sinal;
                    if (this.TipoSanguineo.IdTipoSanguineo != 0)
                        tabPessoa.tab_tipo_sanguineoReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_tipo_sanguineo", "id_tipo_sanguineo", this.TipoSanguineo.IdTipoSanguineo);

                    _context.AddTotab_pessoa(tabPessoa);
                    _context.SaveChanges();
                }
                else
                {
                    tab_pessoa tabPessoa = (from pessoa in _context.tab_pessoa
                                                where pessoa.Id_pessoa == this.IdPessoa
                                                select pessoa).First();

                    if (this.TipoRacaCor.IdTipoRacaCor != 0)
                        tabPessoa.tab_tipo_raca_corReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_tipo_raca_cor", "id_tipo_raca_cor", this.TipoRacaCor.IdTipoRacaCor);
                    tabPessoa.altura = this.Altura;
                    tabPessoa.peso = this.Peso;
                    if (this.TipoCabelo.IdTipoCabelo != 0)
                        tabPessoa.tab_tipo_cabeloReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_tipo_cabelo", "id_tipo_cabelo", this.TipoCabelo.IdTipoCabelo);
                    if (this.TipoOlho.IdTipoOlho != 0)
                        tabPessoa.tab_tipo_olhoReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_tipo_olho", "id_tipo_olho", this.TipoOlho.IdTipoOlho);
                    tabPessoa.sinal = this.Sinal;
                    if (this.TipoSanguineo.IdTipoSanguineo != 0)
                        tabPessoa.tab_tipo_sanguineoReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_tipo_sanguineo", "id_tipo_sanguineo", this.TipoSanguineo.IdTipoSanguineo);

                    _context.SaveChanges();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public void SalvarObs()
        {
            try
            {
                if (this.IdPessoa == 0)
                {
                    tab_pessoa tabPessoa = new tab_pessoa();

                    tabPessoa.quem_sou_eu_quero_da_vida = this.Observacao;
                    tabPessoa.comentario_adicional = this.ObservacaoAdicional;

                    _context.AddTotab_pessoa(tabPessoa);
                    _context.SaveChanges();
                }
                else
                {
                    tab_pessoa tabPessoa = (from pessoa in _context.tab_pessoa
                                                where pessoa.Id_pessoa == this.IdPessoa
                                                select pessoa).First();

                    tabPessoa.quem_sou_eu_quero_da_vida = this.Observacao;
                    tabPessoa.comentario_adicional = this.ObservacaoAdicional;

                    _context.SaveChanges();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public void Salvar()
        {
            try
            {
                tab_pessoa tabPessoa = new tab_pessoa();

                tabPessoa.nome_completo = this.Nome;
                tabPessoa.apelido = this.Apelido;
                tabPessoa.tab_sexoReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_sexo", "id_sexo", this.Sexo.IdTipoSexo);
                tabPessoa.tab_estado_civilReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_estado_civil", "Id_estado_civil", this.EstadoCivil.IdEstadoCivil);
                tabPessoa.dt_nascimento = this.DataNascimento;
                tabPessoa.CPF = this.Cpf;
                tabPessoa.tab_organizacaoReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_organizacao", "Id_organizacao", this.IdOrganizacao);

                _context.AddTotab_pessoa(tabPessoa);
                _context.SaveChanges();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #endregion
    }
}
